////////////////////////////////////////////////////////////////
// filename: character.cpp
// description: source file for our character class
// author: Jay Tomten (jaytomten@gmail.com)
// notes:

// namespace

// defines

// includes
#if defined(__APPLE__)
#include <OpenGL/gl.h>
#else
#include <GL/gl.h>
#endif
#include <SDL/SDL.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <math.h>
#include "object.h"
#include "character.h"

// globals

////////////////////////////////////////////////////////////////
// constructor
Character::Character() {

    // use Init() or alt constructor

}

////////////////////////////////////////////////////////////////
// alternate constructor that initializes character
Character::Character(int type, float x, float y, float z) {

    Init(type, x, y, z);

}

////////////////////////////////////////////////////////////////
// destructor
Character::~Character() {

    delete v;

}

////////////////////////////////////////////////////////////////
// Init() - set up the Character we want
void Character::Init(int type, float x, float y, float z) {

    // the long and ardous task of manual primitive drawing!!!!
    // starting position determines what player they belong to
    switch(type) {
    case CHAR_INFANTRY:
        if(x < 0) {
            team = TEAM_GOOD;
            size = 15;
            v[0].Init( 0.5,-0.2, 0.0,-0.5,-0.2, 0.0);
            v[1].Init(-0.5,-0.2, 0.0,-0.5,-0.9, 0.0);
            v[2].Init(-0.5,-0.9, 0.0, 0.5,-0.9, 0.0);
            v[3].Init( 0.5,-0.9, 0.0, 0.5,-0.2, 0.0);
            v[4].Init( 0.5,-0.2, 0.0,-0.5,-0.9, 0.0);
            v[5].Init( 0.5,-0.9, 0.0,-0.5,-0.2, 0.0);
            v[6].Init( 0.0, 0.0, 0.0, 0.0, 0.4, 0.0); // model
            v[7].Init( -0.1, 0.6, 0.0, 0.1, 0.6, 0.0);
            v[8].Init( -0.1, 0.4, 0.0, 0.1, 0.4, 0.0);
            v[9].Init( -0.1, 0.6, 0.0, -0.1, 0.4, 0.0);
            v[10].Init( 0.1, 0.6, 0.0, 0.1, 0.4, 0.0);
            v[11].Init( 0.0, 0.35, 0.0, -0.2, 0.35, 0.0);
            v[12].Init( -0.2, 0.35, 0.0, -0.2, 0.15, 0.0);
            v[13].Init( -0.2, 0.15, 0.0, 0.0, 0.15, 0.0);
            v[14].Init( 0.0, 0.3, 0.0, 0.2, 0.3, 0.0);
            col.Init(0.0, 1.0, 0.0, 1.0);
        } else {
            team = TEAM_BAD;
            size = 15;
            v[0].Init( 0.0,-0.1, 0.0,-0.5,-0.6, 0.0);
            v[1].Init(-0.5,-0.6, 0.0, 0.0,-1.1, 0.0);
            v[2].Init( 0.0,-1.1, 0.0, 0.5,-0.6, 0.0);
            v[3].Init( 0.5,-0.6, 0.0, 0.0,-0.1, 0.0);
            v[4].Init(-0.25,-0.35, 0.0, 0.25,-0.85, 0.0);
            v[5].Init(-0.25,-0.85, 0.0, 0.25,-0.35, 0.0);
            v[6].Init( 0.0, 0.0, 0.0, 0.0, 0.4, 0.0); // model
            v[7].Init( -0.1, 0.6, 0.0, 0.1, 0.6, 0.0);
            v[8].Init( -0.1, 0.4, 0.0, 0.1, 0.4, 0.0);
            v[9].Init( -0.1, 0.6, 0.0, -0.1, 0.4, 0.0);
            v[10].Init( 0.1, 0.6, 0.0, 0.1, 0.4, 0.0);
            v[11].Init( 0.0, 0.35, 0.0, 0.2, 0.35, 0.0);
            v[12].Init( 0.2, 0.35, 0.0, 0.2, 0.15, 0.0);
            v[13].Init( 0.2, 0.15, 0.0, 0.0, 0.15, 0.0);
            v[14].Init( 0.0, 0.3, 0.0, -0.2, 0.3, 0.0);
            col.Init(1.0, 0.0, 0.0, 1.0);
        }
        cost = 10.0f;
        width = 2.0f;
        t = CHAR_INFANTRY;
        state = STATE_BUILDING;
        // power = 20.0f;
        // range = 5.0f;
        power = 15.0 + (rand()%10000 / 5000.0f - 1.0f) * 5;
        range = 5.0 + (rand()%10000 / 5000.0f - 1.0f);
        life = 55.0f;
        vel = 1.1f;
        alive = true;
        pos.Init(x, y, z);
	break;
    case CHAR_ENGINEER:
        if(x < 0) {
            team = TEAM_GOOD;
            size = 17;
            v[0].Init( 0.5,-0.2, 0.0,-0.5,-0.2, 0.0);
            v[1].Init(-0.5,-0.2, 0.0,-0.5,-0.9, 0.0);
            v[2].Init(-0.5,-0.9, 0.0, 0.5,-0.9, 0.0);
            v[3].Init( 0.5,-0.9, 0.0, 0.5,-0.2, 0.0);
            v[4].Init( 0.25,-0.45, 0.0,-0.25,-0.45, 0.0);
            v[5].Init( 0.25,-0.45, 0.0, 0.25,-0.7, 0.0);
            v[6].Init(-0.25,-0.45, 0.0,-0.25,-0.7, 0.0);
            v[7].Init( 0.0,-0.45, 0.0, 0.0,-0.6, 0.0);
            v[8].Init( 0.0, 0.0, 0.0, 0.0, 0.4, 0.0);
            v[9].Init( -0.1, 0.6, 0.0, 0.1, 0.6, 0.0);
            v[10].Init( -0.1, 0.4, 0.0, 0.1, 0.4, 0.0);
            v[11].Init( -0.1, 0.6, 0.0, -0.1, 0.4, 0.0);
            v[12].Init( 0.1, 0.6, 0.0, 0.1, 0.4, 0.0);
            v[13].Init( 0.0, 0.35, 0.0, -0.2, 0.35, 0.0);
            v[14].Init( -0.2, 0.35, 0.0, -0.2, 0.15, 0.0);
            v[15].Init( -0.2, 0.15, 0.0, 0.0, 0.15, 0.0);
            v[16].Init( 0.0, 0.3, 0.0, 0.2, 0.3, 0.0);
            col.Init(0.0, 1.0, 0.0, 1.0);
        } else {
            team = TEAM_BAD;
            size = 17;
            v[0].Init( 0.0,-0.1, 0.0,-0.5,-0.6, 0.0);
            v[1].Init(-0.5,-0.6, 0.0, 0.0,-1.1, 0.0);
            v[2].Init( 0.0,-1.1, 0.0, 0.5,-0.6, 0.0);
            v[3].Init( 0.5,-0.6, 0.0, 0.0,-0.1, 0.0);
            v[4].Init( 0.25,-0.45, 0.0,-0.25,-0.45, 0.0);
            v[5].Init( 0.25,-0.45, 0.0, 0.25,-0.7, 0.0);
            v[6].Init(-0.25,-0.45, 0.0,-0.25,-0.7, 0.0);
            v[7].Init( 0.0,-0.45, 0.0, 0.0,-0.6, 0.0);
            v[8].Init( 0.0, 0.0, 0.0, 0.0, 0.4, 0.0);
            v[9].Init( -0.1, 0.6, 0.0, 0.1, 0.6, 0.0);
            v[10].Init( -0.1, 0.4, 0.0, 0.1, 0.4, 0.0);
            v[11].Init( -0.1, 0.6, 0.0, -0.1, 0.4, 0.0);
            v[12].Init( 0.1, 0.6, 0.0, 0.1, 0.4, 0.0);
            v[13].Init( 0.0, 0.35, 0.0, 0.2, 0.35, 0.0);
            v[14].Init( 0.2, 0.35, 0.0, 0.2, 0.15, 0.0);
            v[15].Init( 0.2, 0.15, 0.0, 0.0, 0.15, 0.0);
            v[16].Init( 0.0, 0.3, 0.0, -0.2, 0.3, 0.0);
            col.Init(1.0, 0.0, 0.0, 1.0);
        }
        cost = 15.0f;
        width = 2.0f;
        t = CHAR_ENGINEER;
        state = STATE_BUILDING;
        power = 15.0 + (rand()%10000 / 5000.0f - 1.0f) * 3;
        range = 3.0 + (rand()%10000 / 5000.0f - 1.0f);
        // power = 15.0f;
        // range = 3.0f;
        life = 34.0f;
        vel = 0.9f;
        alive = true;
        pos.Init(x, y, z);
	break;
    case CHAR_MEDIC:
        if(x < 0) {
            team = TEAM_GOOD;
            size = 15;
            v[0].Init( 0.5,-0.2, 0.0,-0.5,-0.2, 0.0);
            v[1].Init(-0.5,-0.2, 0.0,-0.5,-0.9, 0.0);
            v[2].Init(-0.5,-0.9, 0.0, 0.5,-0.9, 0.0);
            v[3].Init( 0.5,-0.9, 0.0, 0.5,-0.2, 0.0);
            v[4].Init( 0.0,-0.2, 0.0, 0.0,-0.9, 0.0);
            v[5].Init( 0.5,-0.55, 0.0,-0.5,-0.55, 0.0);
            v[6].Init( 0.0, 0.0, 0.0, 0.0, 0.4, 0.0);
            v[7].Init( -0.1, 0.6, 0.0, 0.1, 0.6, 0.0);
            v[8].Init( -0.1, 0.4, 0.0, 0.1, 0.4, 0.0);
            v[9].Init( -0.1, 0.6, 0.0, -0.1, 0.4, 0.0);
            v[10].Init( 0.1, 0.6, 0.0, 0.1, 0.4, 0.0);
            v[11].Init( 0.0, 0.35, 0.0, -0.2, 0.35, 0.0);
            v[12].Init( -0.2, 0.35, 0.0, -0.2, 0.15, 0.0);
            v[13].Init( -0.2, 0.15, 0.0, 0.0, 0.15, 0.0);
            v[14].Init( 0.0, 0.3, 0.0, 0.2, 0.3, 0.0);
            col.Init(0.0, 1.0, 0.0, 1.0);
        } else {
            team = TEAM_BAD;
            size = 15;
            v[0].Init( 0.0,-0.1, 0.0,-0.5,-0.6, 0.0);
            v[1].Init(-0.5,-0.6, 0.0, 0.0,-1.1, 0.0);
            v[2].Init( 0.0,-1.1, 0.0, 0.5,-0.6, 0.0);
            v[3].Init( 0.5,-0.6, 0.0, 0.0,-0.1, 0.0);
            v[4].Init( 0.0,-0.1, 0.0, 0.0,-1.1, 0.0);
            v[5].Init(-0.5,-0.6, 0.0, 0.5,-0.6, 0.0);
            v[6].Init( 0.0, 0.0, 0.0, 0.0, 0.4, 0.0);
            v[7].Init( -0.1, 0.6, 0.0, 0.1, 0.6, 0.0);
            v[8].Init( -0.1, 0.4, 0.0, 0.1, 0.4, 0.0);
            v[9].Init( -0.1, 0.6, 0.0, -0.1, 0.4, 0.0);
            v[10].Init( 0.1, 0.6, 0.0, 0.1, 0.4, 0.0);
            v[11].Init( 0.0, 0.35, 0.0, 0.2, 0.35, 0.0);
            v[12].Init( 0.2, 0.35, 0.0, 0.2, 0.15, 0.0);
            v[13].Init( 0.2, 0.15, 0.0, 0.0, 0.15, 0.0);
            v[14].Init( 0.0, 0.3, 0.0, -0.2, 0.3, 0.0);
            col.Init(1.0, 0.0, 0.0, 1.0);
        }
        cost = 15.0f;
        width = 2.0f;
        t = CHAR_MEDIC;
        state = STATE_BUILDING;
        // power = 10.0f;
        // range = 2.0f;
        power = 5.0 + (rand()%10000 / 5000.0f - 1.0f) * 5;
        range = 2.0 + (rand()%10000 / 5000.0f - 1.0f);
        life = 19.0f;
        vel = 1.4f;
        alive = true;
        pos.Init(x, y, z);
	break;
    case CHAR_EOD:
        if(x < 0) {
            team = TEAM_GOOD;
            size = 26;
            v[0].Init(  0.5, -0.2,  0.0,-0.5, -0.2,  0.0); // box
            v[1].Init( -0.5, -0.2,  0.0,-0.5, -0.9,  0.0);
            v[2].Init( -0.5, -0.9,  0.0, 0.5, -0.9,  0.0);
            v[3].Init(  0.5, -0.9,  0.0, 0.5, -0.2,  0.0);
            v[4].Init( -0.2,-0.5,  0.0,-0.1,-0.5,  0.0); // e
            v[5].Init( -0.2,-0.6,  0.0,-0.1, -0.6, 0.0);
            v[6].Init( -0.2,-0.7,  0.0,-0.1, -0.7,  0.0);
            v[7].Init( -0.2,-0.5,  0.0,-0.2,-0.7,  0.0);
            v[8].Init( -0.05, -0.5,  0.0, 0.05, -0.5,  0.0); // o
            v[9].Init( -0.05, -0.7,  0.0, 0.05, -0.7,  0.0);
            v[10].Init(-0.05, -0.5,  0.0,-0.05, -0.7,  0.0);
            v[11].Init( 0.05, -0.5,  0.0, 0.05, -0.7,  0.0);
            v[12].Init( 0.1, -0.5,  0.0,  0.1,  -0.7,  0.0); // d
            v[13].Init( 0.1, -0.5,  0.0,  0.15, -0.5,  0.0);
            v[14].Init( 0.1, -0.7,  0.0,  0.2,  -0.7,  0.0);
            v[15].Init( 0.2, -0.55,  0.0, 0.2,  -0.7,  0.0);
            v[16].Init( 0.15, -0.5,  0.0, 0.2,-0.55,  0.0);
            v[17].Init( 0.0,  0.0,  0.0, 0.0,  0.4,  0.0); // model
            v[18].Init(-0.1,  0.6,  0.0, 0.1,  0.6,  0.0);
            v[19].Init(-0.1,  0.4,  0.0, 0.1,  0.4,  0.0);
            v[20].Init(-0.1,  0.6,  0.0,-0.1,  0.4,  0.0);
            v[21].Init( 0.1,  0.6,  0.0, 0.1,  0.4,  0.0);
            v[22].Init( 0.0,  0.35, 0.0,-0.2,  0.35, 0.0);
            v[23].Init(-0.2,  0.35, 0.0,-0.2,  0.15, 0.0);
            v[24].Init(-0.2,  0.15, 0.0, 0.0,  0.15, 0.0);
            v[25].Init( 0.0,  0.3,  0.0, 0.2,  0.3,  0.0);
            col.Init(0.0, 1.0, 0.0, 1.0);
        } else {
            team = TEAM_BAD;
            size = 26;
            v[0].Init( 0.0,-0.1, 0.0,-0.5,-0.6, 0.0); // triangle
            v[1].Init(-0.5,-0.6, 0.0, 0.0,-1.1, 0.0);
            v[2].Init( 0.0,-1.1, 0.0, 0.5,-0.6, 0.0);
            v[3].Init( 0.5,-0.6, 0.0, 0.0,-0.1, 0.0);
            v[4].Init( -0.2,-0.5,  0.0,-0.1,-0.5,  0.0); // e
            v[5].Init( -0.2,-0.6,  0.0,-0.1, -0.6, 0.0);
            v[6].Init( -0.2,-0.7,  0.0,-0.1, -0.7,  0.0);
            v[7].Init( -0.2,-0.5,  0.0,-0.2,-0.7,  0.0);
            v[8].Init( -0.05, -0.5,  0.0, 0.05, -0.5,  0.0); // o
            v[9].Init( -0.05, -0.7,  0.0, 0.05, -0.7,  0.0);
            v[10].Init(-0.05, -0.5,  0.0,-0.05, -0.7,  0.0);
            v[11].Init( 0.05, -0.5,  0.0, 0.05, -0.7,  0.0);
            v[12].Init( 0.1, -0.5,  0.0,  0.1,  -0.7,  0.0); // d
            v[13].Init( 0.1, -0.5,  0.0,  0.15, -0.5,  0.0);
            v[14].Init( 0.1, -0.7,  0.0,  0.2,  -0.7,  0.0);
            v[15].Init( 0.2, -0.55,  0.0, 0.2,  -0.7,  0.0);
            v[16].Init( 0.15, -0.5,  0.0, 0.2,-0.55,  0.0);
            v[17].Init( 0.0,  0.0,  0.0, 0.0,  0.4,  0.0); // model
            v[18].Init(-0.1,  0.6,  0.0, 0.1,  0.6,  0.0);
            v[19].Init(-0.1,  0.4,  0.0, 0.1,  0.4,  0.0);
            v[20].Init(-0.1,  0.6,  0.0,-0.1,  0.4,  0.0);
            v[21].Init( 0.1,  0.6,  0.0, 0.1,  0.4,  0.0);
            v[22].Init( 0.0,  0.35, 0.0, 0.2,  0.35, 0.0);
            v[23].Init( 0.2,  0.35, 0.0, 0.2,  0.15, 0.0);
            v[24].Init( 0.2,  0.15, 0.0, 0.0,  0.15, 0.0);
            v[25].Init( 0.0,  0.3,  0.0,-0.2,  0.3,  0.0);
        }
        cost = 25.0f;
        width = 2.0f;
        t = CHAR_EOD;
        state = STATE_BUILDING;
        power = 20.0 + (rand()%10000 / 5000.0f - 1.0f) * 5;
        range = 5.0 + (rand()%10000 / 5000.0f - 1.0f);
        // power = 25.0f;
        // range = 5.0f;
        life = 1.0f;
        vel = 1.2f;
        alive = true;
        pos.Init(x, y, z);
	break;
    case CHAR_SF:
        if(x < 0) {
            team = TEAM_GOOD;
            size = 21;
            v[0].Init(  0.5, -0.2,  0.0,-0.5, -0.2,  0.0); // box
            v[1].Init( -0.5, -0.2,  0.0,-0.5, -0.9,  0.0);
            v[2].Init( -0.5, -0.9,  0.0, 0.5, -0.9,  0.0);
            v[3].Init(  0.5, -0.9,  0.0, 0.5, -0.2,  0.0);
            v[4].Init( -0.15,-0.5,  0.0,-0.05, -0.5,  0.0); // s
            v[5].Init( -0.15,-0.6, 0.0,-0.05, -0.6, 0.0);
            v[6].Init( -0.15,-0.7,  0.0,-0.05, -0.7,  0.0);
            v[7].Init( -0.15,-0.5,  0.0,-0.15,-0.6, 0.0);
            v[8].Init( -0.05, -0.6, 0.0,-0.05, -0.7,  0.0);
            v[9].Init(  0.05, -0.5,  0.0, 0.05, -0.7,  0.0); // f
            v[10].Init( 0.05, -0.5,  0.0, 0.15,-0.5,  0.0);
            v[11].Init( 0.05, -0.6, 0.0, 0.12,-0.6, 0.0);
            v[12].Init( 0.0,  0.0,  0.0, 0.0,  0.4,  0.0); // model
            v[13].Init(-0.1,  0.6,  0.0, 0.1,  0.6,  0.0);
            v[14].Init(-0.1,  0.4,  0.0, 0.1,  0.4,  0.0);
            v[15].Init(-0.1,  0.6,  0.0,-0.1,  0.4,  0.0);
            v[16].Init( 0.1,  0.6,  0.0, 0.1,  0.4,  0.0);
            v[17].Init( 0.0,  0.35, 0.0,-0.2,  0.35, 0.0);
            v[18].Init(-0.2,  0.35, 0.0,-0.2,  0.15, 0.0);
            v[19].Init(-0.2,  0.15, 0.0, 0.0,  0.15, 0.0);
            v[20].Init( 0.0,  0.3,  0.0, 0.2,  0.3,  0.0);
            col.Init(0.0, 1.0, 0.0, 1.0);
        } else {
            team = TEAM_BAD;
            size = 21;
            v[0].Init(  0.0, -0.1,  0.0,-0.5, -0.6,  0.0); // diamond
            v[1].Init( -0.5, -0.6,  0.0, 0.0, -1.1,  0.0);
            v[2].Init(  0.0, -1.1,  0.0, 0.5, -0.6,  0.0);
            v[3].Init(  0.5, -0.6,  0.0, 0.0, -0.1,  0.0);
            v[4].Init( -0.15,-0.5,  0.0,-0.05, -0.5,  0.0); // s
            v[5].Init( -0.15,-0.6, 0.0,-0.05, -0.6, 0.0);
            v[6].Init( -0.15,-0.7,  0.0,-0.05, -0.7,  0.0);
            v[7].Init( -0.15,-0.5,  0.0,-0.15,-0.6, 0.0);
            v[8].Init( -0.05, -0.6, 0.0,-0.05, -0.7,  0.0);
            v[9].Init(  0.05, -0.5,  0.0, 0.05, -0.7,  0.0); // f
            v[10].Init( 0.05, -0.5,  0.0, 0.15,-0.5,  0.0);
            v[11].Init( 0.05, -0.6, 0.0, 0.12,-0.6, 0.0);
            v[12].Init( 0.0,  0.0,  0.0, 0.0,  0.4,  0.0); // model
            v[13].Init(-0.1,  0.6,  0.0, 0.1,  0.6,  0.0);
            v[14].Init(-0.1,  0.4,  0.0, 0.1,  0.4,  0.0);
            v[15].Init(-0.1,  0.6,  0.0,-0.1,  0.4,  0.0);
            v[16].Init( 0.1,  0.6,  0.0, 0.1,  0.4,  0.0);
            v[17].Init( 0.0,  0.35, 0.0, 0.2,  0.35, 0.0);
            v[18].Init( 0.2,  0.35, 0.0, 0.2,  0.15, 0.0);
            v[19].Init( 0.2,  0.15, 0.0, 0.0,  0.15, 0.0);
            v[20].Init( 0.0,  0.3,  0.0,-0.2,  0.3,  0.0);
            col.Init(1.0, 0.0, 0.0, 1.0);
        }
        cost = 30.0f;
        width = 2.0f;
        t = CHAR_SF;
        state = STATE_BUILDING;
        // power = 30.0f;
        // range = 6.0f;
        power = 30.0 + (rand()%10000 / 5000.0f - 1.0f) * 5;
        range = 6.0 + (rand()%10000 / 5000.0f - 1.0f);
        life = 1.0f;
        vel = 1.3f;
        alive = true;
        pos.Init(x, y, z);
	break;
    default:
        break;
    }

}

////////////////////////////////////////////////////////////////
// Update() - updates a single character when called
bool Character::Update(float d) {

    // movement, determine speed multiplier based on state
    if(team == TEAM_BAD) {
        if(state == STATE_NORM) {
            pos.x -= d * vel;
            col.Init(1.0, 0.0, 0.0, 1.0);
        } else if(state == STATE_ENGAGING) {
            pos.x -= (d * vel) / 2;
            col.Init(1.0, 1.0, 0.0, 1.0);
        } else if(state == STATE_BUILDING) {
            col.Init(1.0, 0.0, 0.0, 1.0);
            life += d * 30.0;
            if(life >= 100.0) state = STATE_NORM;
        } else if(state == STATE_HEALING) {
            pos.x -= d * vel;
            col.Init(0.0, 0.0, 1.0, 1.0);
        } else if(state == STATE_FIXING) {
            col.Init(0.0, 1.0, 1.0, 1.0);
        }
    } else if(team == TEAM_GOOD) {
        if(state == STATE_NORM) {
            pos.x += d * vel;
            col.Init(0.0, 1.0, 0.0, 1.0);
        } else if(state == STATE_ENGAGING) {
            pos.x += (d * vel) / 2;
            col.Init(1.0, 1.0, 0.0, 1.0);
        } else if(state == STATE_BUILDING) {
            col.Init(0.0, 1.0, 0.0, 1.0);
            life += d * 20.0;
            if(life >= 100.0) state = STATE_NORM;
        } else if(state == STATE_HEALING) {
            pos.x += d * vel;
            col.Init(0.0, 0.0, 1.0, 1.0);
        } else if(state == STATE_FIXING) {
            col.Init(0.0, 1.0, 1.0, 1.0);
        }
    }

    // lets try to ID corrupted characters
    if(power > 50.0f || range > 10.0f) col.Init(1.0, 1.0, 1.0, 1.0);

    // don't go over the max life
    if(life > 120.0f) life = 120.0f;

    // kill off the dead ones
    if(pos.x > 100 || pos.x < -100 || life <= 0.01000f) return false;
    else return true;

}

////////////////////////////////////////////////////////////////
// Draw() - updates then draws the character to the screen
void Character::Draw() {

    glPushMatrix();
    glTranslatef(pos.x, pos.y, pos.z);
    glLineWidth(width);
    glColor4f(col.r, col.g, col.b, col.a);
    glBegin(GL_LINES);
        for(int i = 0; i < size; i++) { // run through the array and draw the Characters
            glVertex3f(v[i].x1, v[i].y1, v[i].z1);
            glVertex3f(v[i].x2, v[i].y2, v[i].z2);
        }
        // draw a life bar, cool
        glColor4f(1.0f, (life / 100.0f), ((life / 100.0f) / 2), 1.0f);
        glVertex3f(0.7f, -(life / 100.0f), 0.0f);
        glVertex3f(0.7f, 0.0f, 0.0f);
    glEnd();
    glPopMatrix();

}



